"use strict";
//访问器装饰器
//基本语法
/*
 参数说明：
 ○ target:
 1. 对于实例访问器来说值是【所属类的原型对象】。
 2. 对于静态访问器来说值是【所属类】。
 ○ propertyKey:访问器的名称。
 ○ descriptor: 描述对象。
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
function CustomDemo24(target, propertyKey, descriptor) {
    console.log(target);
    console.log(propertyKey);
    console.log(descriptor);
}
class Person24 {
    get address() {
        return '北京宏福科技园';
    }
    static get country() {
        return '中国';
    }
}
__decorate([
    CustomDemo24
], Person24.prototype, "address", null);
__decorate([
    CustomDemo24
], Person24, "country", null);
const p24 = new Person24();
// console.log(p24.address())
console.log(p24.address);
console.log(Person24.country);
//应⽤举例
// 需求：对 Weather 类的 temp 属性的 set 访问器进⾏限制，设置的最低温度 -50 ，最⾼温度 50
function RangeValidate(min, max) {
    return function (target, propertyKey, descriptor) {
        // 保存原始的 setter ⽅法，以便在后续调⽤中使⽤
        const originalSetter = descriptor.set;
        // 重写 setter ⽅法，加⼊范围验证逻辑
        descriptor.set = function (value) {
            // 检查设置的值是否在指定的最⼩值和最⼤值之间
            if (value < min || value > max) {
                // 如果值不在范围内，抛出错误
                throw new Error(`${propertyKey}的值应该在 ${min} 到 ${max}之间！`);
            }
            // 如果值在范围内，且原始 setter ⽅法存在，则调⽤原始 setter ⽅法
            if (originalSetter) {
                originalSetter.call(this, value);
            }
        };
    };
}
class Weather {
    constructor(_temp) {
        this._temp = _temp;
    }
    // 设置温度范围在 -50 到 50 之间
    set temp(value) {
        this._temp = value;
    }
    get temp() {
        return this._temp;
    }
}
__decorate([
    RangeValidate(-50, 50)
], Weather.prototype, "temp", null);
const we = new Weather(80);
console.log(we.temp);
we.temp = 40;
console.log(we.temp);
